package top.xia17.plugins.fast.common.database.jpa.nsql;

import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;

import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import java.util.Map;

/**
 * 原生Sql查询模板
 * @author xia17
 * @date 2020/7/15 9:17
 */
@RequiredArgsConstructor
public class NativeQueryTemplate {

    /**
     * jpa 中的 entityManager
     */
    private final EntityManager entityManager;

    /**
     * sql
     */
    private final String sql ;

    /**
     * 查询参数 ?表达式 使用 jpa 中的 :paramName 方式  ，所以是个Map
     */
    private final Map<String,Object> queryParams;

    /**
     * result 结果转换
     */
    private final String[] result;

    /**
     * 获取最终执行的sql
     * @param sqlParam sql中的可替换参数 占位符为{} 按sqlParam数组顺序替换
     * @return sql
     */
    private String getFinalSql(Object[] sqlParam){
        if (sqlParam!=null && sqlParam.length!=0){
            return StrUtil.format(this.sql, sqlParam);
        }else {
            return sql;
        }
    }

    /**
     * 构建 原生Sql执行器
     * @param sqlParam sql参数 ， 用与替换sql中的占位符
     * @param queryParams 查询参数 ?表达式 使用 jpa 中的 :paramName 方式  ，所以是个Map
     * @param result  结果转换
     * @return NativeQueryActuator 原生Sql执行器
     */
    public NativeQueryActuator buildQueryActuator(Object[] sqlParam , Map<String,Object> queryParams , String[] result){
        Query query = entityManager.createNativeQuery(this.getFinalSql(sqlParam));
        queryParams.forEach(query::setParameter);
        return new NativeQueryActuator(query,result);
    }

    /**
     * 构建 原生Sql执行器
     * @param sqlParam sql参数 ， 用与替换sql中的占位符
     * @param queryParams 查询参数 ?表达式 使用 jpa 中的 :paramName 方式  ，所以是个Map
     * @return NativeQueryActuator 原生Sql执行器
     */
    public NativeQueryActuator buildQueryActuator(Object[] sqlParam , Map<String,Object> queryParams){
        return buildQueryActuator(sqlParam,queryParams,result);
    }

    /**
     * 构建 原生Sql执行器
     * @param sqlParam sql参数 ， 用与替换sql中的占位符
     * @return NativeQueryActuator 原生Sql执行器
     */
    public NativeQueryActuator buildQueryActuator(Object[] sqlParam){
        return buildQueryActuator(sqlParam,queryParams,result);
    }




}
